             [ Target: Inline patching nSPack 2.x ]

 pH#3 .............F.u.l.l..R.e.v.e.r.s.e............. [    #Sadrzaj    ]
 0x01 ................................................ [ Intro          ]
 0x02 ................................................ [ Tools of trade ]
 0x03 ................................................ [ Inline Patch   ]
 0x04 ................................................ [ Outro & Greetz ]


--[ 0x01 ]----------------------------------------------[     Intro     ]
 
  Do  sada  ste  sigurno  naucili  kako  se inlineuje UPX, ali sta ako se
susretnemo    sa    packerom  koji  nije  toliko  jednostavan  za  inline
patchovanje... 

--[ 0x02 ]---------------------------------------------[ Tools of trade ]

  Da bi smo "popravili" ovaj crackme, trebace nam neki "vaspitni" alati:

 [+] OllyDBG v.1.10 ............................... http://www.ollydbg.de

  i naravno meta:

 [+] crackme.nSPacked.exe ................................ my.target4.zip

  Svi  ovi alati su neophodni svakom reverseru pa predlazem da ako ih vec
nemate,  podhitno  ih  nabavite! Bez njih se dalje citanje ovog teksta ne
isplati!                                                                 

--[ 0x03 ]---------------------------------------------[ Inline  Patch  ]

  Kao  i  do  sada  prvo moramo da pronadjemo pogodno mesto za ubacivanje
naseg  inline  patcha. Ovo prakticno znaci da moramo da pronadjemo packer
exit  point  i  da  ga preusmerimo na nas patch kod. Na packer OEPu imamo
sledeci kod:

0040101B > $- E9 87660000   	JMP crackme_.004076A7
00401020      B4            	DB B4
00401021      09            	DB 09

koji cemo ispratiti klikom na F8, posle cega cemo se naci ovde:

004076A7    9C              	PUSHFD
004076A8    60              	PUSHAD
004076A9    E8 00000000     	CALL crackme_.004076AE

  Ovde cemo primeniti STACK trik tako sto cemo kliknuti 2x F8, posle cega
cemo  postaviti  Hardware  break-point  on dword acces na lokaciju ESPa u
memory dumpu. Klikom na F9 dolazimo do sledece lokacije:

0040791F    61              	POPAD
00407920    9D              	POPFD
00407921  - E9 9A99FFFF     	JMP crackme_.004012C0

  JMP  skok  na  adresi ocigledno vodi ka OEPu i mozemo ga preusmeriti ka
nasem  patch  kodu. Naravno moramo prvo da odredimo mesto u fajlu koje je
dovoljno  veliko  da  sadrzi nas patch. Najcesce se mesto za inline patch
trazi  u  PE Headeru fajla odnosno od adrese 00400300. Mi cemo pritisnuti
CTRL+G  u  Ollyju  i  oticicemo  na  adresu 00400333 na kojoj se trenutno
nalazi  dovoljno  praznog  mesta  za ubacivanje naseg patcha. Naravno ovo
mesto  i  nije  bas  totalno prazno ali ovaj kod se odnosi na glavnu .exe
ikonu  tako  da  nema  veze  da  li  ce  nas  patch kod biti ovde ili ne.
Ubacicemo sledeci kod:

00400333    C605 35104000 F>	MOV BYTE PTR DS:[401035],0FF
0040033A    C605 8A104000 0>	MOV BYTE PTR DS:[40108A],0
00400341    68 C0124000     	PUSH inline_n.004012C0
00400346    C3              	RET

  Ovo  je  veoma  jednostavan patch kod koji patchuje bajtove na adresama
00401035  i  0040108A,  posle  cega se skace na OEP pomocu komandi PUSH i
RET.  Kada  snimimo  ove promene i restartujemo Olly mozemo i da izmenimo
skok  na  adresi  00407921  tako  da  on  pokazuje  na patch kod, odnosno
izmenicemo ga u ovo: 

00407920    9D              	POPFD
00407921  - E9 0D8AFFFF     	JMP inline_n.00400333

 Konacno mozemo da snimimo sve promene i pokusamo da startujemo patchovan
fajl,  ali  ... kao  sto  vidimo  negde smo pogresili jer se program nije
startovao  kao  sto  je  trebalo,  cak naprotiv on se "srusio". Da li smo
nesto  zaboravili? Pogledajmo za trenutak spisak importa koji se nalaze u
pakovanom .exe fajlu. Ako odemo u prozor executable modules videcemo ovo:

Names in crackme_
Address    Section    	Type    (  Name                           Comment
004075BC   nsp1       	Import  (  KERNEL32.VirtualAlloc
004075C0   nsp1       	Import  (  KERNEL32.VirtualFree
004075B8   nsp1       	Import  (  KERNEL32.VirtualProtect

  Par  importa  zaduzenih za alociranje, zastitu i oslobadjanje memorije.
Zastitu memorije? Da, VirtualProtect se koristi da bi se nekoj memoriskoj
alokaciji  dodelio  status: Full Access, Read/Write, Read only,a Posto se
nas  inline  patch  rusi pri pokusaju da upise nas patch u glavnu sekciju
zakljucujemo  da  je  glavna  sekcija  zakljucana  za  pisanje  od strane
VirtualProtecta.   Ovo  bi  trebalo  da  bude  lako  iz  razloga  sto  se
VirtualProtect  vec  nalazi  u  import  tablici,  odnosno  ne  ucitava se
dinamicki.  Logicno  je  da  prvo  sto  nam pada na pamet je postavljanje
break-pointa  na  taj import, ali to nije pravo resenje, pogotovo ne kada
se  radi  o  pakerima.  Posto  Olly  nece  zastati  prilikom postavljanja
break-pointa, moramo da primenimo sledeci trik. 
  Naime  posto  se import vec nalazi u fajlu ocigledno je da program nema
razloga  za  dinamickim ucitavanjem importa, odnosno packer mora prilikom
pozivanje  VirtualProtecta  pristupiti  adresi na kojoj se on nalazi. Ako
pogledamo  nasu  tablicu  importa videcemo da se VirtualProtect nalazi na
adresi 004075B8 zbog cega bi bilo najbolje da postavimo jedan break-point
na  tu adresu. Odnosno necemo postaviti obican break-point na toj adresi,
nego  cemo otici na tu adresu u Hex dumpu kako bi smo postavili memoriski
break-point on access. Zasto ovo radimo? Pa ako pogledate hex dump:

004075B8 >9E 16 E6 77 72 AC E7 77  ...wr..w
004075C0 >CB 15 E8 77 FD 98 E7 77  ...w...w

  videcete  da  je  DWORD  na  adresi  004075B8 ustvari pointer ka adresi
77E6169E,  koja  je  sigurno  lokacija  APIja u kernel32.dll fajlu. Posle
postavljanja memoriskog break-pointa na adresu 004075B8 i klika na F9:

004078F5    74 28           	JE SHORT crackme_.0040791F
004078F7    43              	INC EBX
004078F8    8DB5 6DFEFFFF   	LEA ESI,DWORD PTR SS:[EBP-193]
004078FE    8B16            	MOV EDX,DWORD PTR DS:[ESI]
00407900    56              	PUSH ESI
00407901    51              	PUSH ECX
00407902    53              	PUSH EBX
00407903    52              	PUSH EDX
00407904    56              	PUSH ESI
00407905    FF33            	PUSH DWORD PTR DS:[EBX]
00407907    FF73 04         	PUSH DWORD PTR DS:[EBX+4]
0040790A    8B43 08         	MOV EAX,DWORD PTR DS:[EBX+8]
0040790D    03C2            	ADD EAX,EDX
0040790F    50              	PUSH EAX
00407910    FF95 11FFFFFF   	CALL NEAR DWORD PTR SS:[EBP-EF]  ; kernel32.VirtualProtect
00407916    5A              	POP EDX
00407917    5B              	POP EBX
00407918    59              	POP ECX
00407919    5E              	POP ESI
0040791A    83C3 0C         	ADD EBX,0C
0040791D  ^ E2 E1           	LOOPD SHORT crackme_.00407900
0040791F    61              	POPAD
00407920    9D              	POPFD
00407921  - E9 9A99FFFF     	JMP crackme_.004012C0      <- Jmp to OEP

nalazimo    se    na  adresi  00407910.  Ako  analiziramo  sve  parametre
VirtualProtect funkcije videcemo da se ona ponavlja i primenjuje na svaku
sekciju  odpakovanog  fajla.  Takodje  primecujemo  da  je  ovo poslednja
operacija  koju  nSPack  izvrsava  pre skoka na OEP, odnosno na nas patch
kod.  Ovde  imamo  par mogucih resenja, ali posto je cilj inline patch da
smanji  velicinu samog patch mi cemo pronaci najjednostavnije resenje. To
jest pogledacemo skok na adresi 004078F5 i videcemo da kada se on izvrsi,
ne  izvrsava se VirtualProtect zastita. Dakle jednostavnom promenom skoka
JNZ  u JMP, VirtualProtect se ne izvrsava i nas inline patch radi. Imajte
na  umu da je VirtualProtect cesto koriscena API funkcija i da bi trebalo
da obratite paznju na nju prilikom pravljenja inline patcheva.

--[ 0x04 ]---------------------------------------------[ Outro & Greetz ]

 Konacan rezultat patchovanja mozete videti u fajlu inline.nSPacked.exe

Greetz:

 SeekNDestroy   |   TSRh   |   EMiNENCE   |   CoolPHat   |   ELUSIVE 
b4d_s3c70r | B0r0 | loco | Kostolomac | Virus Krew | Jezgra | BlackHat

--[ EOF ]----------------------------------------------[  made by Ap0x  ]